﻿using System;
using System.Collections.Generic;
using System.Text;
using CeA.Reports.Atendimento.DataAccess.DTO;
using System.Data.OracleClient;
using System.Data;
using CeA.Reports.Atendimento.DataAccess.Helpers;
using CeA.Reports.Atendimento.DataAccess.Criteria;
using IBatisNet.DataMapper;

namespace CeA.Reports.Atendimento.DataAccess.DAO.Oracle {
    public class OracleRegiaoImpl : Regiao {
       

        public OracleRegiaoImpl() {
            //m_connection = OracleDAOFactory.CreateConnection();
        }


        /// <summary>
        /// Lista as RFS com critério de busca.
        /// </summary>
        /// <returns></returns>
        public List<RegiaoDTO> ListarIdentificacao(RegiaoCriteria criteria) {
            IList<RegiaoDTO> list = Mapper.Instance()
                   .QueryForList<RegiaoDTO>("regiaoSelectList", criteria);
            return (List<RegiaoDTO>)list;
        }



        // <summary>
        /// Insere uma nova Regiao.
        /// </summary>
        /// <returns></returns>
        public RegiaoDTO Salvar(RegiaoDTO regiao) {
            int regiaoKey = (int)Mapper.Instance().Insert("regiaoInsert", regiao);
            regiao.Id = regiaoKey;
            //RegiaoDTO regiao_dto = Mapper.Instance().QueryForObject("selectRegiao", regiaoKey) as RegiaoDTO;
            return regiao;
        }

        public void Atualizar(RegiaoDTO regiao) {
            Mapper.Instance().Update("regiaoUpdate", regiao);
        }

        public void Excluir(int id) {
            String listaLojas = checkForExistingLoja(id);
            if (listaLojas != null)
                throw new InvalidOperationException("Há loja com dependencia nessa região. Exclua a dependencia com a(s)loja(s):[" + listaLojas + "].");
            
            Mapper.Instance().Delete("regiaoDelete", id);
        }

        private string checkForExistingLoja(int id)
        {
            IList<String> list = Mapper.Instance()
                   .QueryForList<String>("regiaoSelectListLojas", id);

            String listaLojas = null;
            foreach (String row in list)
            {
                listaLojas += row.ToString() + ", ";
            }

            return listaLojas;
        }

        /// <summary>
        /// alterna as posições das regiões
        /// </summary>
        /// <param name="idSobe"></param>
        /// <param name="idDesce"></param>
        public void AlterarPosicao(int idSobe, int idDesce)
        {
            Mapper.Instance().Update("regiaoSobe", idSobe);
            Mapper.Instance().Update("regiaoDesce", idDesce);
        }

    }
}
